/** ==================================================================================== **/
/** 		Provider per la gestione delle configurazioni custom dell'applicazione		 **/
/** ==================================================================================== **/

/**
 * Il provider viene inizializzato con tutte le costanti censite nel file "../sm/js/appConstants.js".
 * Le costanti sono disponibili in tutta l'applicazione iniettando nei propri service e/o controller l'oggetto "configuration".
 * 
 * Una costante è recuperata nel seguente modo: configuration.getParam(<CHIAVE_PARAMETRO>).
 */
BootApplication.provider('configuration', [ function configurationProvider() {
	
	var config;
	
	/**
	 * Oggetto che costituirà il service restituito nei controller
	 */ 
	var Configuration = function(parameters) {
		/**
		 * Oggetto che manterrà lo stato delle configurazioni settate nel metodo config
		 */
		var config = parameters || {};
		/**
		 * Metodo che restituisce il valore di un determinato parametro.
		 * Il metodo effettua una copia del valore presente in config in modo da impedire l'eventuale sovrascrittura all'interno di un controller
		 */
		function getParameter(key) {
			return angular.copy(config[key]);
		}
		/**
		 * Metodi pubblici del service
		 */
		return {
			getParam: function(key) {
				return getParameter(key);
			},
			addParam: function(key, value) {
				if(config[key]) {
					console.warn('ATTENZIONE!! La chiave <' + key + '> è già associata ad un parametro di configurazione quindi sarà ignorata per evitare la sovrascrittura');
				} else {
					config[key] = value;
				}
			}
		}
	};
	
	/**
	 * Metodo utilizzato all'interno per valorizzare i parametri che serviranno all'interno dell'applicazione 
	 * (con questo metodo è possibile valorizzare un parametro alla volta.
	 */
	this.addParameter = function(key, value) {
		if(config != undefined && config[key]) {
			console.warn('ATTENZIONE!! La chiave <' + key + '> è già associata ad un parametro di configurazione quindi sarà ignorata per evitare la sovrascrittura');
		} else {
			if(config == undefined) config = {};
			
			config[key] = value;
		}
	};
	
	/**
	 * Metodo per sovrascrivere l'intera lista di parametri che saranno utilizzati all'interno dell'applicazione
	 * 
	 * ATTENZIONE! invocandolo 2 volte sovrascrive gli eventuali parametri presenti.
	 */
	this.setParameters = function(params) {
		if(!config || config.length == 0) {
//			console.log("AGGIUNTI PARAMETRI DI CONFIGURAZIONE: \n" + JSON.stringify(params));
		} else {
			console.warn("ATTENZIONE! La seguente lista di parametri:\n" + JSON.stringify(config) + "\n è stata sovrascritta con: \n " + JSON.stringify(params));
		}
		config = params;
	};
	
	/**
	 * Metodo utilizzato dal motore interno per costruire il service
	 */
	this.$get = function () {
		return new Configuration(config);
	};
}]);


/**
 * Lettura delle costanti dell'applicazione e aggiunta delle stesse nell'oggetto configuration di modo che siano disponibili
 * sia nei service che nei controller.
 */
BootApplication.config(['configurationProvider', function(configurationProvider) {
	
	configurationProvider.addParameter("Constants", Constants);
	
	configurationProvider.addParameter("ol.ApplicationProperty", ol.ApplicationProperty);
	configurationProvider.addParameter("ol.interaction.GeometryType", ol.interaction.GeometryType);
	configurationProvider.addParameter("ol.geom.GeometryLayout", ol.geom.GeometryLayout);
	configurationProvider.addParameter("ol.geom.GeometryType", ol.geom.GeometryType);
	configurationProvider.addParameter("ol.LayerType", ol.LayerType);
}]);
